package com.xuyuan.jdk;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 进程，用于控制进程并获取有关该进程的信息。
 * 提供了用于执行进程输入、执行进程输出、等待进程完成、检查进程的退出状态以及销毁（终止）进程的方法。
 * 默认情况下，创建的子进程没有自己的终端或控制台。它的所有标准 I/O（即 stdin、stdout、stderr）操作都将被重定向到父进程，
 * 在那里可以通过使用方法 getInputStream()、getErrorStream()、etOutputStream()流来访问它们。
 * 父进程使用这些流向子进程提供输入和获取子进程的输出。由于某些原生平台只为标准输入流和输出流提供有限的缓冲区大小，因此未能及时写入或读取子进程的输出流可能会导致子进程卡顿，甚至死锁。
 * 如果需要，还可以使用类的方法ProcessBuilder 重定向子进程 I/O。
 * 当没有对 Process 对象的更多引用时，子进程不会被终止，而是子进程继续异步执行。
 * 不要求对象表示 Process 的进程相对于拥有该 Process 对象的 Java 进程异步或并发执行。
 *
 * @see ProcessBuilder
 */
public class JdkProcess {

    public void test() throws IOException, InterruptedException {

        // 获取进程
        Process process = new ProcessBuilder().start();

        // 进程变量Process 本身提供的流
        InputStream inputStream = process.getInputStream();
        OutputStream outputStream = process.getOutputStream();
        InputStream errorStream = process.getErrorStream();


        // 进程是否存活
        process.isAlive();
        // 使当前线程等待直到此Process 对象表示的进程终止。如果子进程已终止，则此方法将立即返回。如果子进程尚未终止，则调用线程将被阻塞，直到子进程退出。
        // 此 Process 对象表示的 subprocess 的 exit 值。按照惯例，该值 0 表示正常终止。
        process.waitFor();
        // 进程是否退出，0退出，异常表示还没有
        process.exitValue();
        // 销毁进程
        process.destroy();
    }
}
